package main

import (
	"errors"
	"fmt"
)

// ==========错误处理==========
// golang中可以抛出一个panic的异常, 然后在defer中通过recover捕获这个异常, 然后正常处理, 程序继续往下执行, 不会中断

// defer + recovery捕获处理异常
func test() {
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()
	n1 := 1
	n2 := 0
	res := n1 / n2
	fmt.Println("res =", res) // 不会再打印
}

// 自定义错误, 使用errors.New和panic内置函数
// errors.New("错误说明")回返回一个error类型的值, 表示一个错误
// panic内置函数接收一个interface{}类型的的值作为参数, 输出错误信息, 并退出程序
func readFile(name string) error {
	if name == "abc" {
		return nil
	}
	return errors.New("fileName not correct")
}

func main() {
	test()
	fmt.Println("test over")
	// 打印顺序
	// runtime error: integer divide by zero
	// over

	err := readFile("ABC")
	// 如果文件读取失败, 控制台输出该err, 程序终止
	if err != nil {
		panic(err)
	}
	// 打印顺序
	// panic: fileName not correct

	fmt.Println("main over") // 如果readFile返回err不为nil, 程序不会执行到这行

}
